<?php

if (!function_exists('dd')) {
    function dd(...$param)
    {
        foreach ($param as $p) {
            \yii\helpers\VarDumper::dump($p, 10, true);
            echo '<pre>';
        }
        exit(1);
    }
}

if (!function_exists('recursive_key_sort')) {
    function recursive_key_sort(&$by_ref_array)
    {
        ksort($by_ref_array);
        foreach ($by_ref_array as $key => $value) {
            if (is_array($value)) {
                recursive_key_sort($by_ref_array[$key]);
            }
        }
    }
}

if (!function_exists("diffBetweenTwoDays")) {
    function diffBetweenTwoDays($day1, $day2)
    {
        $second1 = strtotime($day1);
        $second2 = strtotime($day2);
        if ($second1 < $second2) {
            $tmp = $second2;
            $second2 = $second1;
            $second1 = $tmp;
        }
        return ($second1 - $second2) / 86400;
    }
}

if (!function_exists("getModelError")) {
    function getModelError(\yii\base\Model $model)
    {
        $errors = $model->getErrors();    //得到所有的错误信息
        if (!is_array($errors)) {
            return '';
        }

        $firstError = array_shift($errors);
        if (!is_array($firstError)) {
            return '';
        }
        return array_shift($firstError);
    }
}

if (!function_exists("msectime")) {
    /**
     * 毫秒
     * @return float
     */
    function msectime()
    {
        list($msec, $sec) = explode(' ', microtime());
        $msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
        return $msectime;
    }
}

if (!function_exists("msec_date_time")) {
    /**
     * 毫秒/微妙时间格式
     * @param int $mserLenth 秒后面精确的精度0-6
     * @return string
     */
    function msec_date_time($mserLenth = 6)
    {
        list($usec, $sec) = explode(" ", microtime());
        return date('Y-m-d H:i:s', $sec) . substr($usec, 1, $mserLenth + 1);
    }
}

if (!function_exists("getIp")) {
    /**
     * 获取ip
     */
    function getIp()
    {
        if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
            $ip = getenv("HTTP_CLIENT_IP");
        else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
            $ip = getenv("REMOTE_ADDR");
        else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
            $ip = $_SERVER['REMOTE_ADDR'];
        else
            $ip = "unknown";
        return ($ip);
    }
}

if (!function_exists("is_Date")) {
    /**
     * 判断日期格式
     * @param $str
     * @param string $format
     * @return bool
     */
    function is_Date($str, $format = 'Y-m-d')
    {
        $unixTime_1 = strtotime($str);
        if (!is_numeric($unixTime_1)) return false; //如果不是数字格式，则直接返回
        $checkDate = date($format, $unixTime_1);
        $unixTime_2 = strtotime($checkDate);
        if ($unixTime_1 == $unixTime_2) {
            return true;
        } else {
            return false;
        }
    }
}

if (!function_exists('rsa_encode')) {
    /**
     * rsa 数据处理
     * @param array $data
     * @return string
     */
    function rsa_encode(array $data)
    {
        $str = '';
        foreach ($data as $key => $value) {
            $str .= ($key . '=' . $value . '&');
        }
        return rtrim($str, '&');
    }
}


if (!function_exists("emojiToString")) {
    /**
     * emoji转成string
     *
     **/
    function emojiToString($str)
    {
        if (!is_string($str)) return $str;
        if (!$str || $str == 'undefined') return '';

        $text = json_encode($str); //暴露出unicode
        $text = preg_replace_callback("/(\\\u[ed][0-9a-f]{3})/i", function ($str) {
            return addslashes($str[0]);
        }, $text); //将emoji的unicode留下，其他不动，这里的正则比原答案增加了d，因为我发现我很多emoji实际上是\ud开头的，反而暂时没发现有\ue开头。
        return json_decode($text);
    }
}

if (!function_exists("stringToEmoji")) {
    /**
     * string转成emoji
     *
     **/
    function stringToEmoji($str)
    {
        $text = json_encode($str); //暴露出unicode
        $text = preg_replace_callback('/\\\\\\\\/i', function ($str) {
            return '\\';
        }, $text); //将两条斜杠变成一条，其他不动
        return json_decode($text);
    }

}

if (!function_exists('curlDownloadFile')) {

    /**
     * curl 下载文件
     * @param $url
     * @param $newfname
     * @return bool
     */
    function curlDownloadFile($url, $newfname)
    {
        set_time_limit(24 * 60 * 60); // 设置超时时间

        $file = fopen($url, "rb"); // 远程下载文件，二进制模式
        if ($file) { // 如果下载成功
            $newf = fopen($newfname, "wb"); // 远在文件文件
            if ($newf) // 如果文件保存成功
                while (!feof($file)) { // 判断附件写入是否完整
                    fwrite($newf, fread($file, 1024 * 8), 1024 * 8); // 没有写完就继续
                }
        }
        if ($file) {
            fclose($file); // 关闭远程文件
        }
        if ($newf) {
            fclose($newf); // 关闭本地文件
        }
        return true;

    }
}
if (!function_exists('traverseDir')) {

    /**
     * 获取当前目录下所有目录名
     * @param $dir
     * @return array
     */
    function traverseDir($dir)
    {
        $array = [];
        if ($dir_handle = @opendir($dir)) {
            while ($filename = readdir($dir_handle)) {
                if ($filename != "." && $filename != "..") {
                    $subFile = $dir . DIRECTORY_SEPARATOR . $filename; //要将源目录及子文件相连
                    if (is_dir($subFile)) { //若子文件是个目录
                        $array[] = $filename; //输出该目录名称
                    }
                }
            }
            closedir($dir_handle);
        }
        return $array;

    }

}

if (!function_exists('deleteDir')) {
    /**
     * 删除目录及目录下的文件
     * @param $path
     */
    function deleteDir($path)
    {
        if (is_dir($path)) {
            //扫描一个目录内的所有目录和文件并返回数组
            $dirs = scandir($path);
            foreach ($dirs as $dir) {
                //排除目录中的当前目录(.)和上一级目录(..)
                if ($dir != '.' && $dir != '..') {
                    //如果是目录则递归子目录，继续操作
                    $sonDir = $path . '/' . $dir;
                    if (is_dir($sonDir)) {
                        //递归删除
                        deleteDir($sonDir);
                        //目录内的子目录和文件删除后删除空目录
                        @rmdir($sonDir);
                    } else {
                        //如果是文件直接删除
                        @unlink($sonDir);
                    }
                }
            }
            @rmdir($path);
        }
    }
}

if (!function_exists('getDistance')) {
    /**
     * 计算两点地理坐标之间的距离
     * @param float $longitude1 起点经度
     * @param float $latitude1 起点纬度
     * @param float $longitude2 终点经度
     * @param float $latitude2 终点纬度
     * @param Int $unit 单位 1:米 2:公里
     * @param Int $decimal 精度 保留小数位数
     * @return float
     */
    function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit = 2, $decimal = 2)
    {

        $EARTH_RADIUS = 6370.996; // 地球半径系数
        $PI = 3.1415926;

        $radLat1 = $latitude1 * $PI / 180.0;
        $radLat2 = $latitude2 * $PI / 180.0;

        $radLng1 = $longitude1 * $PI / 180.0;
        $radLng2 = $longitude2 * $PI / 180.0;

        $a = $radLat1 - $radLat2;
        $b = $radLng1 - $radLng2;

        $distance = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2)));
        $distance = $distance * $EARTH_RADIUS * 1000;

        if ($unit == 2) {
            $distance = $distance / 1000;
        }
        return round($distance, $decimal);
    }
}


if (!function_exists('squarePoint')) {
    /**
     * 计算某个经纬度的周围某段距离的正方形的四个点
     * @param float $lng 经度
     * @param float $lat 纬度
     * @param float $distance 该点所在圆的半径，该圆与此正方形内切，默认值为0.5千米
     * @return array 正方形的四个点的经纬度坐标
     */
    function squarePoint($lng, $lat, $distance = 0.5)
    {

        $dlng = 2 * asin(sin($distance / (2 * 6371)) / cos(deg2rad($lat)));
        $dlng = rad2deg($dlng);

        $dlat = $distance / 6371;
        $dlat = rad2deg($dlat);

        return array(
            'left-top' => array('lat' => $lat + $dlat, 'lng' => $lng - $dlng),
            'right-top' => array('lat' => $lat + $dlat, 'lng' => $lng + $dlng),
            'left-bottom' => array('lat' => $lat - $dlat, 'lng' => $lng - $dlng),
            'right-bottom' => array('lat' => $lat - $dlat, 'lng' => $lng + $dlng)
        );
    }
}


if (!function_exists('formatFloatNumber')) {

    /**
     * 格式化浮点数字规范
     * @param $s
     * @return float
     */
    function formatFloatNumber($s)
    {
        $s = trim(strval($s));
        if (preg_match('#^-?\d+?\.0+$#', $s)) {
            return preg_replace('#^(-?\d+?)\.0+$#', '$1', $s);
        }
        if (preg_match('#^-?\d+?\.[0-9]+?0+$#', $s)) {
            return preg_replace('#^(-?\d+\.[0-9]+?)0+$#', '$1', $s);
        }
        return $s;
    }
}


if (!function_exists('formatThousandsNumber')) {

    /**
     * 格式化成千分位(浮点会转换为int)
     * @param $s
     * @return float
     */
    function formatThousandsNumber($s)
    {
        if (empty($s)) return $s;
        $s = number_format(intval(str_replace(',', '', $s)));
        return $s;
    }
}


if (!function_exists('remote_file_exists')) {
    /**
     * 函数：remote_file_exists
     * 功能：判断远程文件是否存在
     * 参数： $url_file -远程文件URL
     * 返回：存在返回true，不存在或者其他原因返回false
     */
    function remote_file_exists($url_file)
    {
        $curl = curl_init($url_file);
        // 不取回数据
        curl_setopt($curl, CURLOPT_NOBODY, true);
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET'); //不加这个会返回403，加了才返回正确的200，原因不明
        // 发送请求
        $result = curl_exec($curl);
        $found = false;
        // 如果请求没有发送失败
        if ($result !== false) {
            // 再检查http响应码是否为200
            $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
            if ($statusCode == 200) {
                $found = true;
            }
        }
        curl_close($curl);
        return $found;
    }
}

if (!function_exists('uncamelize')) {
    /**
     * 驼峰转_写法
     * @param $camelCaps
     * @param string $separator
     * @return string
     */
    function uncamelize($camelCaps, $separator = '_')
    {
        return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $camelCaps));
    }
}